package com.xiao.utils;

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

public  class FileUtil {


    /**
     *
     * @param classPathName 文件所在的 classPath目录 【classPath 即 resource 和 java 下目录,在生成 target 目录时 他们会合并到一起】
     * @return 返回 文件所在绝对目录
     * @throws UnsupportedEncodingException
     */
    public static   String getAbsPathInClassPath(String classPathName) throws UnsupportedEncodingException {
        // 获取当前线程的上下文类加载器后,获取由上下文类加载器负责的资源
        URL absolutePath = Thread.currentThread().getContextClassLoader().getResource(classPathName);

        String absPathStr = absolutePath.getPath();

        // 解码  处理 中文乱码问题
        String decodedAbsPathStr = URLDecoder.decode(absPathStr, "UTF-8");
        // 去掉非法前缀
        if (decodedAbsPathStr.startsWith("/")){
            /**
             * 正则表达式
             * 匹配字符串开头的单个斜杠 /,或者匹配字符串开头的单个双斜杠 \\。
             */
            String str = decodedAbsPathStr.replaceFirst("^/(|\\\\)", "");
            decodedAbsPathStr =str;
        }

        return  decodedAbsPathStr;
    }

    /**
     *
     * @param classPathName 文件所在的 classPath目录 【classPath 即 resource 和 java 下目录,在生成 target 目录时 他们会合并到一起】
     * @return 文件输入流 【输入到内存中】
     * @throws IOException
     */
    public static InputStream getInputStreamInClassPath(String classPathName) throws IOException {
        // 这种方式 生成的jar 包才是有效的; 无效例子：  new FileInputStream(classPathName)
        Resource resource = new PathMatchingResourcePatternResolver().getResource(classPathName);
        InputStream inputStream = resource.getInputStream();
        return inputStream;
    }

    /**
     *  生成 尽量不重复的文件名,
     * @param fileName 上传一个文件路径名/文件名
     * @return 由 日期 和 uuid 组成的文件名
     */
    public static String generateFileName(String fileName){
//根据日期生成路径 2022/1/15/
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddss-");
        String datePath = sdf.format(new Date());
//uuid作为文件名
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//后缀和文件后缀一致
        int index = fileName.lastIndexOf(".");
// test.jpg -> .jpg
        String fileType = fileName.substring(index);
        return new
                StringBuilder().append(datePath).append(uuid).append(fileType).toString();
    }


}
